/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ferramentas;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import pessoal.Curso;
import pessoal.Inscrito;

/**
 *
 * @author ciar
 */
public class GeradorCSV {

    private String textoCSV = "";
    private String finalidade;
    private String polo;
    private String nomeArquivo;

    public GeradorCSV(String finalidade) {
        this.finalidade = finalidade;
        if (finalidade.equals("moodle_homologados") || finalidade.equals("moodle_aprovados")) {
            addCabecalhoMoodle();
        } else {
            addCabecalho();
        }
    }

    private void addCabecalhoMoodle() {
        textoCSV = textoCSV.concat(
                "username; password; firstname; lastname; email; phone1; city; course; group; type; \r\n");
    }

    private void addCabecalho() {
        textoCSV = textoCSV.concat(
                "Nome; E-mail; Telefone; CPF; Polo; Cidade; Data da Inscrição; Data da geração do arquivo: " + new Date(System.currentTimeMillis()) + " \r\n");
    }

    private String formataCPF(String cpfInscrito) {
        StringBuilder cpf = new StringBuilder(cpfInscrito);
        cpf.insert(0, "'");
        return cpf.toString();
    }

    public File gerarListaCSVISO(List<Inscrito> inscritos, Curso curso, String caminhoArquivo) throws UnsupportedEncodingException {
        for (Inscrito inscrito : inscritos) {

            addUsuario(inscrito, curso);

        }
        return geraArquivoCSVISO(caminhoArquivo);
    }

    public File gerarListaCSVUTF(List<Inscrito> inscritos, Curso curso, String caminhoArquivo) throws UnsupportedEncodingException {
        for (Inscrito inscrito : inscritos) {

            addUsuario(inscrito, curso);

        }
        return geraArquivoCSVUTF(caminhoArquivo);
    }

    private void addUsuario(Inscrito inscrito, Curso curso) {
        if (finalidade.equalsIgnoreCase("moodle_homologados")) {
            addUsuarioMoodleHomologados(inscrito);
            setNomeArquivo("lista_moodle_homologados.csv");
        } else if (finalidade.equalsIgnoreCase("moodle_aprovados")) {
            addUsuarioMoodleAprovados(inscrito);
            setNomeArquivo("lista_moodle_aprovados.csv");
        } else if (finalidade.equalsIgnoreCase("sisuab")) {
            addUsuarioSisUab(inscrito, curso);
        } else if (finalidade.equalsIgnoreCase("lista_inscritos")) {
            addUsuarioInscritos(inscrito);
            setNomeArquivo("lista_inscritos.csv");
        } else if (finalidade.equalsIgnoreCase("lista_homologados")) {
            addUsuarioHomologados(inscrito);
            setNomeArquivo("lista_homologados.csv");
        } else if (finalidade.equalsIgnoreCase("lista_nao_homologados")) {
            addUsuarioNaoHomologados(inscrito);
            setNomeArquivo("lista_nao_homologados.csv");
//        } else if (finalidade.equalsIgnoreCase("lista_aprovados")) {
//            addUsuarioAprovados(inscrito);
//            setNomeArquivo("lista_aprovados.csv");
        }
    }

    private File geraArquivoCSVISO(String caminhoArquivo) throws UnsupportedEncodingException {
        File arquivo = new File(caminhoArquivo + getNomeArquivoCSV());
        try {
            PrintWriter pw = new PrintWriter(arquivo, "ISO-8859-1");
            pw.write(textoCSV);
            pw.close();
            return arquivo;

        } catch (FileNotFoundException ex) {
            System.out.println("Erro ao gravar arquivo: " + arquivo.getAbsolutePath() + "\n\tCaminho: " + caminhoArquivo);
            return null;
        }
    }

    private File geraArquivoCSVUTF(String caminhoArquivo) throws UnsupportedEncodingException {
        File arquivo = new File(caminhoArquivo + getNomeArquivoCSV());
        try {
            PrintWriter pw = new PrintWriter(arquivo, "UTF-8");
            pw.write(textoCSV);
            pw.close();
            return arquivo;

        } catch (FileNotFoundException ex) {
            System.out.println("Erro ao gravar arquivo: " + arquivo.getAbsolutePath() + "\n\tCaminho: " + caminhoArquivo);
            return null;
        }
    }

    public void setNomeArquivo(String nomeArquivo) {
        this.nomeArquivo = nomeArquivo;
    }

    public String getNomeArquivoCSV() {
        if (nomeArquivo != null) {
            return nomeArquivo;
        } else {
            return "lista_usuarios.csv";
        }
    }

    private void addUsuarioMoodleHomologados(Inscrito inscrito) {
        //"username; password; firstname; lastname; email; phone1; city; course; group; type;
        String cidadeSedeOuPolo = "";
        if (inscrito.getPolo() == null) {
            cidadeSedeOuPolo = inscrito.getCidadeSede().getNome();
        } else if (inscrito.getModalidade().equalsIgnoreCase("orientador")) {
            cidadeSedeOuPolo = "Sede do curso";
        } else {
            cidadeSedeOuPolo = inscrito.getPolo().getNome();
        }
        if (inscrito.getHomologado() == 1) {
            textoCSV = textoCSV.concat(""
                    + formataCPF(inscrito.getCpf()) + ";"
                    + ";"
                    + inscrito.getNome() + ";"
                    + inscrito.getSobrenome() + ";"
                    + inscrito.getEmail() + ";"
                    + inscrito.getDdd() + " " + inscrito.getTelefone() + ";"
                    + inscrito.getEndereco().getCidade() + ";"
                    + ";"
                    + cidadeSedeOuPolo + ";"
                    + "1; "
                    + "\r\n");
        }
    }

    private void addUsuarioMoodleAprovados(Inscrito inscrito) {
        //"username; password; firstname; lastname; email; phone1; city; course; group; type;
        String cidadeSedeOuPolo = "";
        if (inscrito.getPolo() == null) {
            cidadeSedeOuPolo = inscrito.getCidadeSede().getNome();
        } else {
            cidadeSedeOuPolo = inscrito.getPolo().getNome();
        }
        if (inscrito.isAprovado()) {
            textoCSV = textoCSV.concat(""
                    + formataCPF(inscrito.getCpf()) + ";"
                    + ";"
                    + inscrito.getNome() + ";"
                    + inscrito.getSobrenome() + ";"
                    + inscrito.getEmail() + ";"
                    + inscrito.getDdd() + " " + inscrito.getTelefone() + ";"
                    + inscrito.getEndereco().getCidade() + ";"
                    + ";"
                    + cidadeSedeOuPolo + ";"
                    + "1; "
                    + "\r\n");
        }
    }

    private void addUsuarioInscritos(Inscrito inscrito) {
        //"Nome; E-mail; Telefone; CPF; Polo; Cidade; Data da Inscrição;
        String cidadeSedeOuPolo = "";
        if (inscrito.getPolo() == null) {
            cidadeSedeOuPolo = inscrito.getCidadeSede().getNome();
        } else if (inscrito.getModalidade().equalsIgnoreCase("orientador")) {
            cidadeSedeOuPolo = "Sede do curso";
        } else {
            cidadeSedeOuPolo = inscrito.getPolo().getNome();
        }
        textoCSV = textoCSV.concat(""
                + inscrito.getNome() + " " + inscrito.getSobrenome() + ";"
                + inscrito.getEmail() + ";"
                + inscrito.getDdd() + " " + inscrito.getTelefone() + ";"
                + formataCPF(inscrito.getCpf()) + ";"
                + cidadeSedeOuPolo + ";"
                + inscrito.getEndereco().getCidade() + ";"
                + inscrito.getData() + ";"
                + "\r\n");
    }

    private void addUsuarioHomologados(Inscrito inscrito) {
        // ( firstname, lastname, username, password, email, lang, city, country, ajax, course1, type1 )
        if (inscrito.getHomologado() == 1) {
            String cidadeSedeOuPolo = "";
            if (inscrito.getPolo() == null) {
                cidadeSedeOuPolo = inscrito.getCidadeSede().getNome();
            } else if (inscrito.getModalidade().equalsIgnoreCase("orientador")) {
                cidadeSedeOuPolo = "Sede do curso";
            } else {
                cidadeSedeOuPolo = inscrito.getPolo().getNome();
            }
            textoCSV = textoCSV.concat(""
                    + inscrito.getNome() + " " + inscrito.getSobrenome() + ";"
                    + inscrito.getEmail() + ";"
                    + inscrito.getDdd() + " " + inscrito.getTelefone() + ";"
                    + formataCPF(inscrito.getCpf()) + ";"
                    + cidadeSedeOuPolo + ";"
                    + inscrito.getEndereco().getCidade() + ";"
                    + inscrito.getData() + ";"
                    + "\r\n");
        }

    }

    private void addUsuarioNaoHomologados(Inscrito inscrito) {
        // ( firstname, lastname, username, password, email, lang, city, country, ajax, course1, type1 )
        if (!(inscrito.getHomologado() == 1)) {
            String cidadeSedeOuPolo = "";
            if (inscrito.getPolo() == null) {
                cidadeSedeOuPolo = inscrito.getCidadeSede().getNome();
            } else if (inscrito.getModalidade().equalsIgnoreCase("orientador")) {
                cidadeSedeOuPolo = "Sede do curso";
            } else {
                cidadeSedeOuPolo = inscrito.getPolo().getNome();
            }
            textoCSV = textoCSV.concat(""
                    + inscrito.getNome() + " " + inscrito.getSobrenome() + ";"
                    + inscrito.getEmail() + ";"
                    + inscrito.getDdd() + " " + inscrito.getTelefone() + ";"
                    + formataCPF(inscrito.getCpf()) + ";"
                    + cidadeSedeOuPolo + ";"
                    + inscrito.getEndereco().getCidade() + ";"
                    + inscrito.getData() + ";"
                    + "\r\n");
        }

    }

//    private void addUsuarioAprovados(Inscrito inscrito) {
//        // ( firstname, lastname, username, password, email, lang, city, country, ajax, course1, type1 )
//        if (inscrito.isAprovado()) {
//            String cidadeSedeOuPolo = "";
//            if (inscrito.getPolo() == null) {
//                cidadeSedeOuPolo = inscrito.getCidadeSede().getNome();
//            } else {
//                cidadeSedeOuPolo = inscrito.getPolo().getNome();
//            }
//            textoCSV = textoCSV.concat(""
//                    + inscrito.getNome() + " " + inscrito.getSobrenome() + ";"
//                    + inscrito.getEmail() + ";"
//                    + inscrito.getDdd() + " " + inscrito.getTelefone() + ";"
//                    + formataCPF(inscrito.getCpf()) + ";"
//                    + cidadeSedeOuPolo + ";"
//                    + inscrito.getEndereco().getCidade() + ";"
//                    + inscrito.getData() + ";"
//                    + "\r\n");
//        }
//    }
    private void addUsuarioSisUab(Inscrito inscrito, Curso curso) {
        // ( CPF , CEP , FORMA INGRESSO , PERÍODO INGRESSO , CÓDIGO VAGA , CÓDIGO SITUAÇÃO INICIAL , CÓDIGO SITUAÇÃO ATUAL )
        if ((inscrito.getHomologado()==1) && inscrito.isAprovado()) {
            if (polo != null) {
                if (!polo.equals(inscrito.getPoloString())) {
                    return;
                }
            }
            // CPF
            String cpf = inscrito.getCpf().replaceAll("\\.", "").replaceAll("-", "").replaceAll(" ", "");
            if (cpf.length() < 11) {
                for (int faltante = (11 - cpf.length()); faltante > 0; faltante--) {
                    cpf = "0" + cpf;
                }
            }
            if (cpf.length() > 11) {
                int sobrando = (cpf.length() - 11);
                cpf = cpf.substring((sobrando), cpf.length());
            }
            // CEP
            String cep = inscrito.getEndereco().getCep().replaceAll("\\.", "").replaceAll("-", "").replaceAll(" ", "");
            if (cep.length() < 8) {
                for (int faltante = (8 - cep.length()); faltante > 0; faltante--) {
                    cep = cep + "0";
                }
            }
            if (cep.length() > 8) {
                cep = cep.substring(0, 8);
            }
            // DDD
            String ddd = inscrito.getDdd().replaceAll("\\.", "").replaceAll("-", "").replaceAll(" ", "");
            if (ddd.length() > 3) {
                ddd = ddd.substring(0, 3);
            }
            if (ddd.length() < 3) {
                for (int faltante = (3 - ddd.length()); faltante > 0; faltante--) {
                    ddd = "0" + ddd;
                }
            }
            //TELEFONE
            String telefone = inscrito.getTelefone().replaceAll("-", "").replaceAll("\\.", "").replaceAll(" ", "");
            if (telefone.length() > 8) {
                int sobrando = (telefone.length() - 8);
                telefone = telefone.substring((sobrando), telefone.length());
            }
            if (telefone.length() < 8) {
                for (int faltante = (8 - telefone.length()); faltante > 0; faltante--) {
                    telefone = telefone + "0";
                }
            }

            String linha = ""
                    + "\"" + cpf + "\";" // CPF: 11 dígitos, só números
                    + "\"" + cep + "\";" // CEP: 08 dígitos, só números
                    + "\"AE\";" // Forma Ingresso: 02 letras
                    + "\"" + getPeriodoAtual() + "\";" // Período Ingresso: 02 dígitos, só números
                    + "\"" + curso.getTipoVaga() + "\";" // Tipo Vaga: 02 letras (PR, DS)
                    + "\"CUR\";" // Situação inicial: 03 letras
                    + "\"CUR\";" // Situação atual: 03 letras
                    + "\"" + inscrito.getEmail() + "\";"
                    + "\"" + ddd + "\";"
                    + "\"" + telefone + "\";"
                    + "\"0000\""
                    + "\r\n";
            textoCSV = textoCSV.concat(linha);
        }
    }

    private String getPeriodoAtual() {
        Calendar cal = Calendar.getInstance();
        // 1º SEMESTRE
        if (cal.get(Calendar.MONTH) < Calendar.JULY) {
            return "01";
        }// 2º SEMESTRE
        else {
            return "02";
        }
    }

    public void setPolo(String polo) {
        this.polo = polo;
    }
}
